﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

namespace Microsoft.DotNet.Cli.Commands.Test;

internal class VSTestTrace
{
    public static bool TraceEnabled { get; private set; }
    private static readonly string s_traceFilePath;

    static VSTestTrace()
    {
        TraceEnabled = int.TryParse(Environment.GetEnvironmentVariable("DOTNET_CLI_VSTEST_TRACE"), out int enabled) && enabled == 1;
        s_traceFilePath = Environment.GetEnvironmentVariable("DOTNET_CLI_VSTEST_TRACEFILE");
        if (TraceEnabled)
        {
            Console.WriteLine($"[dotnet test - {DateTime.UtcNow}]Logging to {(!string.IsNullOrEmpty(s_traceFilePath) ? s_traceFilePath : "console")}");
        }
    }

    public static void SafeWriteTrace(Func<string> messageLog)
    {
        if (!TraceEnabled)
        {
            return;
        }

        try
        {
            string message = $"[dotnet test - {DateTimeOffset.UtcNow.ToString(format: "MM/dd/yyyy HH:mm:ss.fff")}]{messageLog()}";
            if (!string.IsNullOrEmpty(s_traceFilePath))
            {
                lock (s_traceFilePath)
                {
                    using StreamWriter logFile = File.AppendText(s_traceFilePath);
                    logFile.WriteLine(message);
                }
            }
            else
            {
                Console.WriteLine(message);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"[dotnet test - {DateTimeOffset.UtcNow}]{ex}");
        }
    }
}
